home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Boxer / PalmBoxer / makedoc.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-23  |  2.1 KB  |  106 lines

  1. #define IGNORE_STDIO_STUBS
  2. #define __string_h
  3.  
  4. #ifdef OLDGCC
  5.  
  6. #include <Common.h>
  7. #include <System/SysAll.h>
  8. #include <UI/UIAll.h>
  9. #include <Unix/sys_types.h>
  10.  
  11. #else
  12.  
  13. #include <PalmOS.h>
  14. #include <PalmCompatibility.h>
  15. #include <Unix/sys_types.h>
  16.  
  17. #endif
  18.  
  19. #include "stringil.h"
  20. #include "stdio2.h"
  21.  
  22. int compdoc(unsigned char *ibuf, int ilen, unsigned char *obuf, int level);
  23.  
  24. int MakeDoc(char *name, FILE * fd, int destr)
  25. {
  26.   VoidHand hand2;
  27.   VoidPtr ptr2, ptr1;
  28.   char xbuf[36];
  29.   Err err;
  30.   LocalID docid;
  31.   DmOpenRef docdb;
  32.   UInt32 length, count;
  33.   UInt16 nrecs, dbrec, l;
  34.   RectangleType r;
  35.  
  36.   r.topLeft.x = 0, r.topLeft.y = 15, r.extent.x = 160, r.extent.y = 30;
  37.   WinEraseRectangle(&r, 0);
  38.   r.topLeft.y = 30, r.extent.y = 15;
  39.  
  40.   strcpy(xbuf, name);
  41.   err = DmCreateDatabase(0, xbuf, 'REAd', 'TEXt', 0);
  42.  
  43.   if (err == dmErrAlreadyExists) {
  44.     strcat(xbuf, "@");
  45.     while (err == dmErrAlreadyExists) {
  46.       xbuf[strlen(xbuf) - 1]++;
  47.       err = DmCreateDatabase(0, xbuf, 'REAd', 'TEXt', 0);
  48.     }
  49.   }
  50.  
  51.   docid = DmFindDatabase(0, xbuf);
  52.   docdb = DmOpenDatabase(0, docid, dmModeReadWrite);
  53.  
  54.   FileTell(fd, &length, NULL);
  55.   if( destr) 
  56.     FileControl(fileOpDestructiveReadMode, fd, NULL, NULL);
  57.  
  58.   count = length;
  59.   nrecs = 0;
  60.  
  61.   ptr1 = MemPtrNew(6144);
  62.  
  63.   while (count) {
  64.     dbrec = 0xffff;
  65.     l = count > 4096 ? 4096 : count;
  66.     hand2 = DmNewRecord(docdb, &dbrec, l);
  67.     ptr2 = MemHandleLock(hand2);
  68.     count -= FileDmRead(fd, ptr2, 0, 1, l, &err);
  69.  
  70.     r.extent.x = 160 - (160 * count / length);
  71.     WinDrawRectangle(&r, 0);
  72.     WinDrawChars("Compress..",10,8,32);
  73.  
  74.     l = compdoc(ptr2,l,ptr1, 2);
  75.     if( l )
  76.       DmWrite(ptr2,0,ptr1,l);
  77.  
  78.     MemHandleUnlock(hand2);
  79.  
  80.     if( l )
  81.       DmResizeRecord(docdb,dbrec,l);
  82.  
  83.     DmReleaseRecord(docdb, dbrec, 1);
  84.  
  85.   }
  86.  
  87.   MemPtrFree(ptr1);
  88.  
  89.   nrecs = dbrec + 1;
  90.  
  91.   dbrec = 0;
  92.   hand2 = DmNewRecord(docdb, &dbrec, 16);
  93.   ptr2 = MemHandleLock(hand2);
  94.   memset(xbuf, 0, 16);
  95.   xbuf[1] = 2;
  96.   xbuf[10] = 0x10;
  97.   DmWrite(ptr2, 0, xbuf, 16);
  98.   DmWrite(ptr2, 4, &length, 4);
  99.   DmWrite(ptr2, 8, &nrecs, 2);
  100.   MemHandleUnlock(hand2);
  101.   DmReleaseRecord(docdb, dbrec, 1);
  102.   DmCloseDatabase(docdb);
  103.  
  104.   return 0;
  105. }
  106.